package com.example.sd;

import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Environment;
import android.os.FileUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

import org.apache.commons.lang3.StringUtils;

import cn.hutool.core.io.FileUtil;


/**
 * 在 Android 中，你可以使用以下代码来获取外部存储信息：
 * java// 获取外部存储目录的根路径File externalStorageDirectory = Environment.getExternalStorageDirectory();// 获取外部存储的公共目录路径（照片）
 * File publicStorageDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);// 获取外部存储的下载目录路径
 * File downloadStorageDirectory = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Download";// 检查外部存储是否可用
 * if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {    // 可以访问外部存储} else {    // 无法访问外部存储}
 *
 * 在上述代码中，Environment.getExternalStorageDirectory() 方法返回了外部存储目录的根路径，
 * 而 Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) 方法返回了照片目录的公共路径。
 * 你可以使用这些路径来创建文件或文件夹，并访问外部存储。
 * 同时，你可以使用 Environment.getExternalStorageState() 方法来检查外部存储是否可用。
 * 如果返回值为 Environment.MEDIA_MOUNTed，则表示可以访问外部存储；否则，表示无法访问外部存储。
 *
 * String downloadPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getPath(); 获取下载路径
 * 请注意，从 Android 10（API级别29）开始，对于外部存储的访问已经有所限制。
 * 你可能需要使用 Storage Access Framework 来请求访问权限。因此，在某些情况下，获取到的路径可能不是始终有效的。
 *
 *
 *
 * 在Android中，“allow management of all files”和“allow access Midea only”是两个不同的权限和限制，用于控制应用程序对文件系统的访问和操作。
 *
 * “allow management of all files”权限允许应用程序对所有文件进行管理操作，例如读取、写入、删除、修改等。
 * 这个权限可以让应用程序访问并操作设备上的所有文件，包括系统文件和用户文件。
 * 拥有这个权限的应用程序可以对设备上的任何文件进行修改或删除，可能会导致系统不稳定或数据丢失。
 *
 * “allow access Midea only”是一个更为特定的权限限制，仅允许应用程序访问和操作与Midea相关的文件或目录。
 * 这个权限通常是在设备上安装了Midea品牌的设备后，应用程序需要特别授权才能访问和操作与该设备相关的文件或目录。
 * 这个权限限制比“allow management of all files”更为具体，仅允许应用程序访问和操作与Midea设备相关的文件，而对其他文件没有影响。
 *
 * 因此，“allow management of all files”是一个广泛的权限，允许应用程序对所有文件进行管理操作，
 * 而“allow access Midea only”是一个特定的权限限制，仅允许应用程序访问和操作与Midea相关的文件或目录。
 */
public class MainActivity extends AppCompatActivity {

    public static final String[] PERMISSION_SDCARD = new String[]{
            android.Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE
    };
    public static final int REQUEST_CODE_SDCARD = 1;

    public static final String TAG = "MainActivity";

    File dir;
    EditText et_content,et_view_content;

    Button btn1,btn2;



    class A implements View.OnClickListener{

        @Override
        public void onClick(View view) {
            int id = view.getId();
            String filename = "example.txt";
            String stringToWrite = "Hello, world!";
            switch (id){
                // 保存数据到内部存储
                case R.id.svBtn1:
                    try {
                        FileOutputStream fos = openFileOutput(filename, Context.MODE_PRIVATE);
                        fos.write(stringToWrite.getBytes());
                        fos.close();
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    break;
                    // 获取保存的数据
                case R.id.gtBtn1:
                    try {
                        FileInputStream fis = openFileInput(filename);
                        InputStreamReader isr = new InputStreamReader(fis);
                        BufferedReader bufferedReader = new BufferedReader(isr);
                        StringBuilder sb = new StringBuilder();
                        String line;
                        while ((line = bufferedReader.readLine()) != null) {
                            sb.append(line);
                        }
                        String result = sb.toString();
                        Toast.makeText(MainActivity.this,result,Toast.LENGTH_LONG).show();
                        fis.close();
                        // 处理读取到的数据
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    break;
                default:
                    break;

            }
        }
    }



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        dir = getDir("sd_hello2",MODE_PRIVATE); // 获取应用程序的私有目录

        TextView msg = findViewById(R.id.msg);
        msg.setText(dir.getAbsolutePath());
        // getFilesDir:/data/user/0/com.example.sd/files
        // getDir:/data/user/0/com.example.sd/app_MainActivity
        Log.d(TAG, "getFilesDir:"+getFilesDir());
        Log.d(TAG, "getDir:"+getDir("MainActivity",MODE_PRIVATE));


        et_content = findViewById(R.id.content);
        et_view_content = findViewById(R.id.et_view_content);

        // 内部存储保存和获取数据
        btn1 = findViewById(R.id.svBtn1);
        btn2 = findViewById(R.id.gtBtn1);

        btn1.setOnClickListener(new A());
        btn2.setOnClickListener(new A());

        Button saveBtn = findViewById(R.id.save_btn);
        Button getGrant = findViewById(R.id.getGrant);
        Button viewBtn = findViewById(R.id.view_btn);


        // 动态获取sd卡访问权限
        getGrant.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                permission();
            }
        });

        saveBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                performAction();
            }
        });

        viewBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                viewContent();
            }
        });
    }

    private void viewContent() {

        dir = getFilesDir();
        // 执行外部存储操作，例如读取文件
        File file = new File(dir, "filename.txt");
        if (file.exists()) {
            String s = FileUtil.readString(file, Charset.defaultCharset());
            et_view_content.setText(s);
        }
    }

    private void permission() {
//        if(PermissionUtils.checkPermission(this,PERMISSION_SDCARD,REQUEST_CODE_SDCARD)){
//            performAction();
//        }
        if(ContextCompat.checkSelfPermission(this,Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
                || ContextCompat.checkSelfPermission(this,Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
            // 没有权限，申请权限
            ActivityCompat.requestPermissions(this,PERMISSION_SDCARD,REQUEST_CODE_SDCARD);
        }else{
            performAction();
        }

    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        switch (requestCode) {
            case REQUEST_CODE_SDCARD: {
                // 如果请求被用户接受，则每个权限的 grantResults 数组元素都是
                // PackageManager.PERMISSION_GRANTED，并且实际结果将是有效的。
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED
                && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
                    // 权限被授予，可以执行你的操作
                    Toast.makeText(MainActivity.this,"获取了sd卡的读写权限",Toast.LENGTH_LONG).show();
                } else {
                    // 权限被拒绝，可以提示用户或者禁用相关功能
                    Toast.makeText(MainActivity.this,"未获取sd卡的读写权限",Toast.LENGTH_LONG).show();
                }
                break;
            }
            default:
                break;

            // 其他 'case' 行处理其他权限请求
        }
    }

    private void performAction() {
        try {
            dir = getFilesDir();
            // 执行外部存储操作，例如读取文件
            File file = new File(dir, "filename.txt");
            if (file.exists()) {
                if(writeString2File(file)){
                    ToastUtils.show(this,"保存内容成功");
                };
            } else {
                // 处理文件不存在的情况
                if(file.createNewFile()){
                    if(writeString2File(file)){
                        ToastUtils.show(this,"保存内容成功");
                    };
                }
            }
        } catch (Exception e) {
            // 处理异常情况
        }
    }

    private boolean writeString2File(File file) {
        boolean flag = false;
        String content = et_content.getText().toString();
        // 处理文件读取的相关操作
        if(StringUtils.isNotBlank(content)){
            FileUtil.writeString(content, file,Charset.defaultCharset());
            flag = true;
        }
        return flag;
    }
}